using System.Collections.Generic;
using System.Text;
using Tayx.Graphy.UI;
using Tayx.Graphy.Utils;
using Tayx.Graphy.Utils.NumString;
using UnityEngine;
using UnityEngine.UI;

namespace Tayx.Graphy.Advanced
{
	public class G_AdvancedData : MonoBehaviour, IMovable, IModifiableState
	{
		[SerializeField]
		private List<Image> m_backgroundImages = new List<Image>();

		[SerializeField]
		private Text m_graphicsDeviceVersionText;

		[SerializeField]
		private Text m_processorTypeText;

		[SerializeField]
		private Text m_operatingSystemText;

		[SerializeField]
		private Text m_systemMemoryText;

		[SerializeField]
		private Text m_graphicsDeviceNameText;

		[SerializeField]
		private Text m_graphicsMemorySizeText;

		[SerializeField]
		private Text m_screenResolutionText;

		[SerializeField]
		private Text m_gameWindowResolutionText;

		[Range(1f, 60f)]
		[SerializeField]
		private float m_updateRate = 1f;

		private GraphyManager m_graphyManager;

		private RectTransform m_rectTransform;

		private float m_deltaTime;

		private StringBuilder m_sb;

		private GraphyManager.ModuleState m_previousModuleState;

		private GraphyManager.ModuleState m_currentModuleState;

		private readonly string[] m_windowStrings = new string[6]
		{
			"Window: ",
			"x",
			"@",
			"Hz",
			"[",
			"dpi]"
		};

		private void OnEnable()
		{
			Init();
		}

		private void Update()
		{
			m_deltaTime += Time.unscaledDeltaTime;
			if (m_deltaTime > 1f / m_updateRate)
			{
				m_sb.Length = 0;
				m_sb.Append(m_windowStrings[0]).Append(Screen.width.ToStringNonAlloc()).Append(m_windowStrings[1])
					.Append(Screen.height.ToStringNonAlloc())
					.Append(m_windowStrings[2])
					.Append(Screen.currentResolution.refreshRate.ToStringNonAlloc())
					.Append(m_windowStrings[3])
					.Append(m_windowStrings[4])
					.Append(Screen.dpi.ToStringNonAlloc())
					.Append(m_windowStrings[5]);
				m_gameWindowResolutionText.text = m_sb.ToString();
				m_deltaTime = 0f;
			}
		}

		public void SetPosition(GraphyManager.ModulePosition newModulePosition)
		{
			Vector2 anchoredPosition = m_backgroundImages[0].rectTransform.anchoredPosition;
			float num = Mathf.Abs(anchoredPosition.x);
			Vector2 anchoredPosition2 = m_rectTransform.anchoredPosition;
			float num2 = Mathf.Abs(anchoredPosition2.y);
			switch (newModulePosition)
			{
			case GraphyManager.ModulePosition.TOP_LEFT:
				m_rectTransform.anchorMax = Vector2.one;
				m_rectTransform.anchorMin = Vector2.up;
				m_rectTransform.anchoredPosition = new Vector2(0f, 0f - num2);
				m_backgroundImages[0].rectTransform.anchorMax = Vector2.up;
				m_backgroundImages[0].rectTransform.anchorMin = Vector2.zero;
				m_backgroundImages[0].rectTransform.anchoredPosition = new Vector2(num, 0f);
				break;
			case GraphyManager.ModulePosition.TOP_RIGHT:
				m_rectTransform.anchorMax = Vector2.one;
				m_rectTransform.anchorMin = Vector2.up;
				m_rectTransform.anchoredPosition = new Vector2(0f, 0f - num2);
				m_backgroundImages[0].rectTransform.anchorMax = Vector2.one;
				m_backgroundImages[0].rectTransform.anchorMin = Vector2.right;
				m_backgroundImages[0].rectTransform.anchoredPosition = new Vector2(0f - num, 0f);
				break;
			case GraphyManager.ModulePosition.BOTTOM_LEFT:
				m_rectTransform.anchorMax = Vector2.right;
				m_rectTransform.anchorMin = Vector2.zero;
				m_rectTransform.anchoredPosition = new Vector2(0f, num2);
				m_backgroundImages[0].rectTransform.anchorMax = Vector2.up;
				m_backgroundImages[0].rectTransform.anchorMin = Vector2.zero;
				m_backgroundImages[0].rectTransform.anchoredPosition = new Vector2(num, 0f);
				break;
			case GraphyManager.ModulePosition.BOTTOM_RIGHT:
				m_rectTransform.anchorMax = Vector2.right;
				m_rectTransform.anchorMin = Vector2.zero;
				m_rectTransform.anchoredPosition = new Vector2(0f, num2);
				m_backgroundImages[0].rectTransform.anchorMax = Vector2.one;
				m_backgroundImages[0].rectTransform.anchorMin = Vector2.right;
				m_backgroundImages[0].rectTransform.anchoredPosition = new Vector2(0f - num, 0f);
				break;
			}
			switch (newModulePosition)
			{
			case GraphyManager.ModulePosition.FREE:
				break;
			case GraphyManager.ModulePosition.TOP_LEFT:
			case GraphyManager.ModulePosition.BOTTOM_LEFT:
				m_processorTypeText.alignment = TextAnchor.UpperLeft;
				m_systemMemoryText.alignment = TextAnchor.UpperLeft;
				m_graphicsDeviceNameText.alignment = TextAnchor.UpperLeft;
				m_graphicsDeviceVersionText.alignment = TextAnchor.UpperLeft;
				m_graphicsMemorySizeText.alignment = TextAnchor.UpperLeft;
				m_screenResolutionText.alignment = TextAnchor.UpperLeft;
				m_gameWindowResolutionText.alignment = TextAnchor.UpperLeft;
				m_operatingSystemText.alignment = TextAnchor.UpperLeft;
				break;
			case GraphyManager.ModulePosition.TOP_RIGHT:
			case GraphyManager.ModulePosition.BOTTOM_RIGHT:
				m_processorTypeText.alignment = TextAnchor.UpperRight;
				m_systemMemoryText.alignment = TextAnchor.UpperRight;
				m_graphicsDeviceNameText.alignment = TextAnchor.UpperRight;
				m_graphicsDeviceVersionText.alignment = TextAnchor.UpperRight;
				m_graphicsMemorySizeText.alignment = TextAnchor.UpperRight;
				m_screenResolutionText.alignment = TextAnchor.UpperRight;
				m_gameWindowResolutionText.alignment = TextAnchor.UpperRight;
				m_operatingSystemText.alignment = TextAnchor.UpperRight;
				break;
			}
		}

		public void SetState(GraphyManager.ModuleState state, bool silentUpdate = false)
		{
			if (!silentUpdate)
			{
				m_previousModuleState = m_currentModuleState;
			}
			m_currentModuleState = state;
			bool flag = state == GraphyManager.ModuleState.FULL || state == GraphyManager.ModuleState.TEXT || state == GraphyManager.ModuleState.BASIC;
			base.gameObject.SetActive(flag);
			m_backgroundImages.SetAllActive(flag && m_graphyManager.Background);
		}

		public void RestorePreviousState()
		{
			SetState(m_previousModuleState);
		}

		public void UpdateParameters()
		{
			foreach (Image backgroundImage in m_backgroundImages)
			{
				backgroundImage.color = m_graphyManager.BackgroundColor;
			}
			SetPosition(m_graphyManager.AdvancedModulePosition);
			SetState(m_graphyManager.AdvancedModuleState);
		}

		public void RefreshParameters()
		{
			foreach (Image backgroundImage in m_backgroundImages)
			{
				backgroundImage.color = m_graphyManager.BackgroundColor;
			}
			SetPosition(m_graphyManager.AdvancedModulePosition);
			SetState(m_currentModuleState, silentUpdate: true);
		}

		private void Init()
		{
			if (!G_FloatString.Inited || G_FloatString.MinValue > -1000f || G_FloatString.MaxValue < 16384f)
			{
				G_FloatString.Init(-1001f, 16386f);
			}
			m_graphyManager = base.transform.root.GetComponentInChildren<GraphyManager>();
			m_sb = new StringBuilder();
			m_rectTransform = GetComponent<RectTransform>();
			m_processorTypeText.text = "CPU: " + SystemInfo.processorType + " [" + SystemInfo.processorCount + " cores]";
			m_systemMemoryText.text = "RAM: " + SystemInfo.systemMemorySize + " MB";
			m_graphicsDeviceVersionText.text = "Graphics API: " + SystemInfo.graphicsDeviceVersion;
			m_graphicsDeviceNameText.text = "GPU: " + SystemInfo.graphicsDeviceName;
			m_graphicsMemorySizeText.text = "VRAM: " + SystemInfo.graphicsMemorySize + "MB. Max texture size: " + SystemInfo.maxTextureSize + "px. Shader level: " + SystemInfo.graphicsShaderLevel;
			Resolution currentResolution = Screen.currentResolution;
			m_screenResolutionText.text = "Screen: " + currentResolution.width + "x" + currentResolution.height + "@" + currentResolution.refreshRate + "Hz";
			m_operatingSystemText.text = "OS: " + SystemInfo.operatingSystem + " [" + SystemInfo.deviceType + "]";
			float num = 0f;
			List<Text> list = new List<Text>();
			list.Add(m_graphicsDeviceVersionText);
			list.Add(m_processorTypeText);
			list.Add(m_systemMemoryText);
			list.Add(m_graphicsDeviceNameText);
			list.Add(m_graphicsMemorySizeText);
			list.Add(m_screenResolutionText);
			list.Add(m_gameWindowResolutionText);
			list.Add(m_operatingSystemText);
			List<Text> list2 = list;
			foreach (Text item in list2)
			{
				if (item.preferredWidth > num)
				{
					num = item.preferredWidth;
				}
			}
			m_backgroundImages[0].rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, num + 10f);
			RectTransform rectTransform = m_backgroundImages[0].rectTransform;
			float num2 = (num + 15f) / 2f;
			Vector2 anchoredPosition = m_backgroundImages[0].rectTransform.anchoredPosition;
			float x = num2 * Mathf.Sign(anchoredPosition.x);
			Vector2 anchoredPosition2 = m_backgroundImages[0].rectTransform.anchoredPosition;
			rectTransform.anchoredPosition = new Vector2(x, anchoredPosition2.y);
			UpdateParameters();
		}
	}
}
